# 教程地址：https://mesa.readthedocs.io/en/latest/tutorials/intro_tutorial.html
from mesa import Agent, Model
from mesa.time import RandomActivation


class MoneyAgent(Agent):
    "带有固定初始财富的代理人。"

    def __init__(self, id, model):
        super().__init__(id, model)  # 自身的id和归属的模型。
        self.wealth = 1

    def step(self):
        if (self.wealth == 0):
            return
        otherAgent = self.random.choice(self.model.schedule.agents)  # 在模型的多个Agent中，随机选出一个
        otherAgent.wealth += 1  # 人，给他一块钱的红包。相当于是蒙特卡洛仿真一下。当然，过程结束之后谁得到多少钱是随机的。
        self.wealth -= 1


class MoneyModel(Model):
    def __init__(self, N):
        self.agentNum = N
        self.schedule = RandomActivation(self)
        # 创建Agents
        for i in range(self.agentNum):
            a = MoneyAgent(i, self)
            self.schedule.add(a)

    def step(self):
        self.schedule.step()


model = MoneyModel(10)
for i in range(10):  # 进行10步。
    model.step()

import matplotlib.pyplot as plt

agent_wealth = [a.wealth for a in model.schedule.agents]

plt.figure(1)
plt.hist(agent_wealth)
#将这种游戏反复进行一百次，每次游戏进行10轮，将每次游戏之后的钱数看做观察样本，一共一千个。
all_wealth = []
for j in range(100):
    # Run the model
    model = MoneyModel(10)
    for i in range(10):
        model.step()

    # 储存结果
    for agent in model.schedule.agents:
        all_wealth.append(agent.wealth)
plt.figure(2)
plt.hist(all_wealth, bins=range(max(all_wealth) + 1))

plt.show()
